<!DOCTYPE html>
<html>
<head>
    <title>js面向对象-apply-call</title>
    <meta charset="utf-8"/>
    <script src="../../js/jquery-1.10.1.min.js"></script>
    <script src="../../js/json2.js"></script>
    <script>

        /**
         * ECMAScript规范给所有函数都定义了Call()与apply()两个方法，call与apply的第一个参数都是需要调用的函数对象，
         * 在函数体内这个参数就是this的值，剩余的参数是需要传递给函数的值，
         * call与apply的不同就是call传的值可以是任意的，而apply传的剩余值必须为数组
         * func.call(func1,var1,var2,var3)
         * 对应的apply写法为：func.apply(func1,[var1,var2,var3])
         */
        function add(a, b) { return a + b; }
        function sub(a, b) { return a - b; }

        var a1 = sub.apply(add, [4, 2]);
        var a2= add.apply(sub, [4, 2]);
        console.log(a1 + "," + a2);

        var a3 = sub.call(add, 4, 2);
        var a4= add.call(sub, 4, 2);
        console.log(a3 + "," + a4);

        console.log("-----------------------------------------------------");
        function Person(name,age) {
            this.name=name;
            this.age=age;
            this.money = 500;
        }

        function myFun(money) {
            alert(this.money);
        }

        var money = 100;
        myFun(money);
        //return 100;  //window.myFun(money); save to myFun(money);
        //这个时候this指向的是window对象，其实myFun函数和定义的var money = 100;都作为window对象子对象（即全局对象）

        myFun.apply(window,[]);  //save to window.myFun.apply(window,[]);
        //return 100;  //同上

        myFun.apply(new Person('zhangsan',23),[]);
        //return 500, 空数组作为参数，仅符合语法要求
        //这个时候myFun方法里面的this指向的是new Person('zhangsan',23)对象，二不是myFun类(函数)，故弹出500

        myFun.call(new Person('zhangsan',23),money,300,'mycardId');
        //return 500, 后面money,300和mycardId是参数列表作为参数，一一列出
        //这个时候myFun方法里面的this指向的是new Person('zhangsan',23)对象，二不是myFun类(函数)，故弹出500

    </script>
</head>
<body>

</body>
</html>